﻿using System;
using System.Threading;
using Teigha.Core;
using Teigha.TD;

namespace OdaOperation.Core.Creators
{
    public class TextStyleCreator
    {
        /// <summary>
        /// 获取文本框的宽度和高度
        /// </summary>
        /// <param name="text"></param>
        /// <param name="fontStyle"></param>
        /// <param name="fontSize"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        private void GetTextBox(string text, string fontStyle, double fontSize, out double width, out double height)
        {
            MemoryTransaction value = MemoryManager.GetMemoryManager().StartTransaction(Thread.CurrentThread.ManagedThreadId); // 开始内存事务
            try
            {
                // 创建数据库对象
                OdDbDatabase odDbDatabase = OdDbDatabase.createObject();
                // 初始化默认字体样式
                OdDbObjectId textStyle = InitDefaultsFont(odDbDatabase);
                // 创建文本对象
                OdDbText odDbText = OdDbText.createObject();
                // 设置文本内容
                odDbText.setTextString(text);
                // 创建一个包围框对象
                OdGeExtents3d odGeExtents3d = new OdGeExtents3d();
                // 设置文本高度
                odDbText.setHeight(fontSize);
                // 如果有指定字体样式，则设置字体样式
                if (fontStyle != null)
                {
                    odDbText.setTextStyle(textStyle);
                }
                // 设置数据库默认值
                odDbText.setDatabaseDefaults(odDbDatabase);
                // 获取文本的几何包围框
                odDbText.getGeomExtents(odGeExtents3d);
                // 创建一个点数组对象
                OdGePoint3dArray odGePoint3dArray = new OdGePoint3dArray();
                // 获取文本的边界点
                odDbText.getBoundingPoints(odGePoint3dArray);
                // 获取文本的抓握点
                odDbText.getGripPoints(odGePoint3dArray);
                // 计算文本框的高度和宽度
                height = odGeExtents3d.maxPoint().y - odGeExtents3d.minPoint().y;
                width = odGeExtents3d.maxPoint().x - odGeExtents3d.minPoint().x;
                // 释放数据库对象
                odDbDatabase.Dispose();
            }
            finally
            {
                MemoryManager.GetMemoryManager().StopTransaction(value); // 停止内存事务
            }
        }

        /// <summary>
        /// 获取字体对象的 ID
        /// </summary>
        /// <param name="database"></param>
        /// <param name="styleName"></param>
        /// <returns></returns>
        public static OdDbObjectId GetFont(OdDbDatabase database, string styleName)
        {
            // 如果字体样式名称为空，则返回 null
            if (string.IsNullOrWhiteSpace(styleName))
            {
                return null;
            }
            // 获取文本样式表对象
            OdDbTextStyleTable odDbTextStyleTable = database.getTextStyleTableId().openObject() as OdDbTextStyleTable;
            // 如果文本样式表中不存在指定的样式名称，则返回 null
            if (!odDbTextStyleTable.has(styleName))
            {
                return null;
            }
            // 返回指定样式名称的字体对象 ID
            return odDbTextStyleTable.getAt(styleName);
        }

        /// <summary>
        /// 初始化默认字体样式，并返回字体对象的 ID
        /// </summary>
        /// <param name="database"></param>
        /// <returns></returns>
        public static OdDbObjectId InitDefaultsFont(OdDbDatabase database)
        {
            try
            {
                MemoryTransaction value = MemoryManager.GetMemoryManager().StartTransaction(Thread.CurrentThread.ManagedThreadId); // 开始内存事务
                                                                                                                                   // 获取文本样式表对象
                OdDbTextStyleTable odDbTextStyleTable = database.getTextStyleTableId().openObject() as OdDbTextStyleTable;
                // 如果文本样式表中已经存在 "F-HZTXT" 样式，则返回其对应的对象 ID
                if (odDbTextStyleTable.has("F-HZTXT"))
                {
                    return odDbTextStyleTable.getAt("F-HZTXT");
                }
                // 如果不存在，则创建新的文本样式表记录对象
                OdDbTextStyleTableRecord odDbTextStyleTableRecord = OdDbTextStyleTableRecord.createObject();
                // 设置样式名称
                odDbTextStyleTableRecord.setName("F-HZTXT");
                // 设置文件名
                odDbTextStyleTableRecord.setFileName("simplex.shx");
                // 设置大字体文件名
                odDbTextStyleTableRecord.setBigFontFileName("gbcbig.shx");
                // 升级打开文本样式表对象
                odDbTextStyleTable.upgradeOpen();
                // 将新创建的文本样式表记录添加到文本样式表中
                odDbTextStyleTable.add(odDbTextStyleTableRecord);
                // 降级打开文本样式表对象
                odDbTextStyleTable.downgradeOpen();
                MemoryManager.GetMemoryManager().StopTransaction(value); // 停止内存事务
                                                                         // 返回指定样式名称的字体对象 ID
                return odDbTextStyleTable.getAt("F-HZTXT");
            }
            catch (Exception)
            {
                return null;
            }
        }
    }

}